package cn.com.baiwei.service.impl;

import cn.com.baiwei.mapper.MerchandiseMapper;
import cn.com.baiwei.pojo.Merchandise;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * (Merchandise)表服务实现类
 *
 * @author X_Q
 * @since 2021-09-15 14:52:55
 * @version 1.0
 */
@Service("merchandiseService")
public class MerchandiseServiceImpl {
    @Resource
    private MerchandiseMapper merchandiseMapper;

    /**
     * 根据模糊条件查询总个数
     *
     * @param merchandiseName 查询条件
     * @return 返回查询到的总个数
     */
    public Map<String, Object> selectForCount(String merchandiseName) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.merchandiseMapper.selectForCount(merchandiseName));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
    public Map<String, Object> selectAll() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.merchandiseMapper.selectAll());
        return map;
    }

    /**
     * 通过ID查询单条积分商品数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectById(Integer id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", id+"商品查询成功");
        map.put("data", this.merchandiseMapper.selectById(id));
        return map;
    }

    /**
     * 查询分页数据
     *
     * @param index 查询起始位置
     * @param merchandiseName  查询条件
     * @return 对象列表
     */
/*    public Map<String, Object> selectForPage(int index, String merchandiseName) {
    // 获取当前表中的总记录
        int tableCount = this.merchandiseMapper.selectForCount(merchandiseName);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / 10 + 1;
        // 计算每页开始的下标值
        index = (index - 1) * 10;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 查询的记录总页码
        map.put("count", tableCount);     // 当前表中的总条数
        map.put("data", this.merchandiseMapper.selectForPage(index, merchandiseName));
        return map;
    }*/

    /**
     * 新增数据
     *
     * @param merchandise 实例对象
     * @return 实例对象
     */
    public Map<String, Object> insert(Merchandise merchandise) throws IOException {
        this.merchandiseMapper.insert(merchandise);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "成功新增积分商品");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param merchandise 实例对象
     * @return 实例对象
     */
    public Map<String, Object> updateById(Merchandise merchandise) {
        this.merchandiseMapper.updateById(merchandise);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "成功更新积分商品");
        return map;
    }

    /**
     * 修改积分商品图片
     * @param file 文件名
     * @param request 转发
     * @return
     */
    public Map<String, Object> uploadPicture(Integer id,MultipartFile file, HttpServletRequest request)  throws IOException{
        Map<String, Object> map = new HashMap<>();
        if(null == id) {
            map.put("code", 500);
            map.put("msg", "请重新选择！");
        }
        String timeMillis = "" + System.currentTimeMillis();
        String dirStr ="uploadPicture" ;  //  merchandisePicture/文件名称
        // request.getServletContext().getRealPath("") 根据相对路径获取服务器上资源的绝对路径
        String filePath =request.getServletContext().getRealPath("")+dirStr + File.separator + timeMillis + file.getOriginalFilename() ;//上传到的路径及文件名称
        File newFile = new File(filePath);
        FileCopyUtils.copy(file.getBytes(),newFile);
        String   merchandisePicture = File.separator +dirStr + File.separator  + timeMillis + file.getOriginalFilename(); //存入数据库:/foodPicture/文件名
        System.out.println(merchandisePicture);
        merchandiseMapper.uploadPicture(merchandisePicture,id);
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "成功修改积分商品图片");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> deleteById(String id) {
        this.merchandiseMapper.deleteById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "积分商品删除成功");
        return map;
    }
}